import 'package:flutter/painting.dart';

/// **语法高亮主题**：
///
/// - 用于将不同类型的语法 token（关键字、字符串、注释、数字等）
///   映射到对应的 [TextStyle]。
/// - 本类并不负责“识别 token”，而仅负责“定义样式”。
/// - 通常与 [SyntaxHighlighter] 配合使用。
///
/// ### 字段说明
/// - [base]：基础样式（字体族、字号、字重等）；
/// - [keyword]：关键字样式；
/// - [string]：字符串字面量样式；
/// - [comment]：注释样式；
/// - [number]：数字字面量样式；
/// - [identifier]：标识符（变量名、函数名）样式；
/// - [punctuation]：标点符号样式（如 `;`、`,`、`{`、`}`）；
/// - [operator_]：操作符样式（如 `+`、`-`、`==`）；
/// - [whitespace]：空白字符样式（一般等同于 [base]）。
///
/// ### 内置工厂方法
/// - [HighlightTheme.light]：浅色彩色主题；
/// - [HighlightTheme.plain]：纯黑主题（所有 token 统一样式，无高亮）。
class HighlightTheme {
  /// 基础文本样式。
  final TextStyle base;

  /// 关键字样式。
  final TextStyle keyword;

  /// 字符串字面量样式。
  final TextStyle string;

  /// 注释样式。
  final TextStyle comment;

  /// 数字字面量样式。
  final TextStyle number;

  /// 标识符样式（变量名、函数名）。
  final TextStyle identifier;

  /// 标点符号样式（如 `;`, `,`, `{`, `}`）。
  final TextStyle punctuation;

  /// 操作符样式（如 `+`, `-`, `==`）。
  final TextStyle operator_;

  /// 空白字符样式（一般与 base 相同）。
  final TextStyle whitespace;

  /// 构造函数：需显式传入每个 token 类型的样式。
  const HighlightTheme({
    required this.base,
    required this.keyword,
    required this.string,
    required this.comment,
    required this.number,
    required this.identifier,
    required this.punctuation,
    required this.operator_,
    required this.whitespace,
  });

  /// **彩色主题（浅色系）**
  ///
  /// - 使用 [base] 作为基础样式，并为各类 token 设置了常见的配色：
  ///   - 关键字：紫色，加粗；
  ///   - 字符串：绿色；
  ///   - 注释：灰色，斜体可选；
  ///   - 数字：蓝色；
  ///   - 标识符：深灰接近黑色；
  ///   - 标点/操作符：深灰色；
  ///   - 空白：保持原样。
  factory HighlightTheme.light({required TextStyle base}) {
    final b = base;
    return HighlightTheme(
      base: b,
      keyword: b.copyWith(color: const Color(0xFF7C4DFF), fontWeight: FontWeight.w600),
      string: b.copyWith(color: const Color(0xFF43A047)),
      comment: b.copyWith(color: const Color(0xFF9E9E9E), fontStyle: FontStyle.normal),
      number: b.copyWith(color: const Color(0xFF1976D2)),
      identifier: b.copyWith(color: const Color(0xFF212121)),
      punctuation: b.copyWith(color: const Color(0xFF424242)),
      operator_: b.copyWith(color: const Color(0xFF424242)),
      whitespace: b,
    );
  }

  /// **纯黑主题**
  ///
  /// - 所有 token 使用同一基础样式（默认黑色）。
  /// - 适合：
  ///   - 不需要语法高亮的语言；
  ///   - 仅做“代码等宽渲染”而不做彩色区分的场景。
  factory HighlightTheme.plain({required TextStyle base}) {
    // 强制将 base 设置为黑色
    final b = base.copyWith(color: const Color(0xFF000000));
    return HighlightTheme(
      base: b,
      keyword: b,
      string: b,
      comment: b,
      number: b,
      identifier: b,
      punctuation: b,
      operator_: b,
      whitespace: b,
    );
  }
}
